#include <iostream>
using namespace std;

/*
    转换函数dynamic_cast
        用于父类指针指向子类地址的转换
    转换函数static_cast
        用于子类指针指向父类地址的转换
    转换函数const_cast
        用于去除const修饰符，不能作用在对象本身
    转换函数reinterpret_cast
        用于将一个指针或引用转换成另一个类型    C++的强制类型转换
*/

class Animal
{
};

class Cat : public Animal
{
};

struct student
{
    char name[20];
    int age;
};

int main()
{
    Cat c1;
    // Animal *p = &c1; 父类指针指向子类地址    以前：不需要转换
    // 提供了转换函数
    Animal *p = dynamic_cast<Animal *>(&c1);

    Animal a1;
    // Cat *p2 = (Cat *)(&a1); 以前：需要强制转换才能使用
    Cat *p2 = static_cast<Cat *>(&a1);

    int a = 10;
    const int *p3 = &a;
    // int *q = p;  编译出错
    int *q = const_cast<int *>(p3);
    *q = 20;
    cout << *q << endl;

    struct student s1 = {"张三", 18};
    // C语言的强制转换
    char *p4 = (char *)&s1;

    // C++的强制转换
    char *p5 = reinterpret_cast<char *>(&s1);

    return 0;
}